package com.yimi.yinhepda.utils;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonParseException;
import com.google.gson.reflect.TypeToken;
import com.pda.uce.commom.util.LogUtil;
import com.pda.ym.utils.StringUtils;

import java.lang.reflect.Type;
import java.util.List;

/**
 * @author 刘宏恩
 */
public class Parser {
  /** 设置日期格式 */
  public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd HH:mm:ss";

  public Object parserFromJson(Class clazz, String jsonData) {
    try {
      jsonData = removeSpecialChar(jsonData);
      GsonBuilder builder = new GsonBuilder();
      String datePattern = DEFAULT_DATE_PATTERN;
      builder.setDateFormat(datePattern);
      Gson gson = builder.create();
      return gson.fromJson(jsonData, clazz);
    } catch (JsonParseException e) {
      e.printStackTrace();
      return null;
    }
  }

  public List<String> parserListFromJson(String jsonData) {
    try {
      jsonData = removeSpecialChar(jsonData);
      Gson gson = new Gson();
      List<String> strList = gson.fromJson(jsonData, new TypeToken<List<String>>() {
      }.getType());
      return strList;
    } catch (JsonParseException e) {
      return null;
    }
  }

  /**
   * zengyan 补充 把Json数据转换成对象集合
   */
  public static <T> List<T> getListFromJson(String jsonString, Type type) {
    return getListFromJson(jsonString, type, null);
  }

  /**
   * zengyan 补充 把Json数据转换成对象集合
   *
   * @param jsonString 要转换的json数据
   * @param type 类型
   * @param datePattern 日期格式
   */
  public static <T> List<T> getListFromJson(String jsonString, Type type, String datePattern) {
    if (StringUtils.isEmpty(jsonString)) {
      return null;
    }
    GsonBuilder builder = new GsonBuilder();
    if (StringUtils.isEmpty(datePattern)) {
      datePattern = DEFAULT_DATE_PATTERN;
    }
    builder.setDateFormat(datePattern);
    Gson gson = builder.create();
    try {
      jsonString = removeSpecialChar(jsonString);
      return gson.fromJson(jsonString, type);
    } catch (Exception e) {
      LogUtil.e(jsonString + " 无法转换为目标对象集合!");
      return null;
    }
  }

  /**
   * zengyan补充把Json数据转换成对象
   */
  public static <T> T getObjectFromJson(String jsonString, Class<T> cls) {
    return getObjectFromJson(jsonString, cls, null);
  }

  /**
   * zengyan补充把Json数据转换成对象
   */
  public static <T> T getObjectFromJson(String jsonString, Class<T> cls, String datePattern) {
    if (StringUtils.isEmpty(jsonString)) {
      return null;
    }
    GsonBuilder builder = new GsonBuilder();
    if (StringUtils.isEmpty(datePattern)) {
      datePattern = DEFAULT_DATE_PATTERN;
    }
    builder.setDateFormat(datePattern);
    Gson gson = builder.create();
    try {
      jsonString = removeSpecialChar(jsonString);
      return gson.fromJson(jsonString, cls);
    } catch (Exception e) {
      LogUtil.e(jsonString + " 无法转换为 " + cls.getName() + " 对象!");
      return null;
    }
  }

  // 将对象编译成json
  public static String toJson(Object m) {
    Gson gson = new Gson();
    return gson.toJson(m);
  }

  /**
   * 去除掉json里面的特殊字符，否则会解析错误！
   *
   * @note 有个特殊的字符：不能在这里面过滤，只能在要调用parse的方法之前进行过滤，
   * @note 因为json的格式一般是 【属性 ：值】的方式，所以不能这么处理
   */
  public static String removeSpecialChar(String jsonString) {

    // if (!StringUtils.isEmpty(jsonString)) {
    // jsonString = jsonString.replace(" ", "").replace("\n", "");
    // }
    return jsonString;
  }
}
